package network.step3;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 프로그램을 짤때 메소드부터 생각하지 말고 먼저 말로 쭉 프로세스를 풀어보고, 그래도 이해가 안되면 그림을 그려봐라.
 * 
 */

public class SimpleServer3 {
	public static void main(String[] args) throws IOException{
		ServerSocket serverSocket = new ServerSocket(5000);
		
		Socket socket = null;
		BufferedReader br = null;
		PrintWriter out = null;
		PrintWriter outFile = null;
		/*
		 * 이 서버에서 현재 하는 일은
		 * 1. 서버 소켓을 통해 클라이언트 연결에 준비하고
		 * 2. 문자열을 라인단위로 Input받을 수 있게 끔 하고
		 * 3. 서버에 들어온 문자를 다시 아웃풋 소켓과 스트림으로 연결해서 문자열로 출력하게 한다.
		 * 4. 그래서 문자열이 인풋되면 그것을 br.readLine메소드를 통해 받아서 변수 str에 집어넣고
		 * 5. 그 집어넣은 문자를 서버 콘솔창에 뿌리고 다시 println메소드를 통해 출력한다. 
		 * 6. 이 짓을 문자열이 안들어올때까지 반복한다.
		 */
		while(true){
			try{
				socket = serverSocket.accept();
				
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				out = new PrintWriter(socket.getOutputStream(), true);
				//outFile = new PrintWriter("c:\\day\\ttaa.txt");
				//위에 아래의 차이를 공부하자. 그리고 밑에거 API를 확인하자.
				outFile = new PrintWriter(new FileWriter("c:\\day\\ttaa.txt",true));
				//왜 이 시점인지 공부하자
				outFile.println("입력 시작 일시 : "+currentDayTime());
				
				String str = br.readLine();
				while(str != null){
					System.out.println(str);
					outFile.println(str);
					out.println(str);
					str = br.readLine();
				}
				outFile.println("입력 종료 일시 : "+currentDayTime());
			}catch(IOException e){
				e.printStackTrace();
			}finally{
				//소켓을 마지막에 닫아라.
				
				if(br != null) br.close();
				if(out != null)out.close();
				if(outFile != null)outFile.close();
				if(socket != null) socket.close();
			}
		}
	}
	//메소드가 호출 된 시점(일시)을 String으로 return
	public static String currentDayTime(){
		//Date : 날짜와 시간을 추상화한 클래스
		Date d = new Date();//no아규먼트 생성자 - 객체가 생성된 그 순간의 시간을 저장
		//SimpleDateFormat -> date를 원하는 날짜 시간 형식으로 변환된 String으로 변환
		SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd/E/HH/mm/ss/");
		//Date값을 그냥 출력해보자. API를 뒤져보자.
		return format.format(d);
	}
}
